<?php
// +----------------------------------------------------------------------
// | 简易CMS
// +----------------------------------------------------------------------
// | Copyright (C) 2010 Hoping Software Studio.
// +----------------------------------------------------------------------
// | Version $Id$
// +----------------------------------------------------------------------

namespace app\common\model;
use CMS\Model;


/**
 * 文档基础模型
 */
class ArticleTitle extends Model{

    /* 自动验证规则 */
    protected $_validate = array(
        array('shorttitle', '/^[a-zA-Z]\w{0,200}$/', '文档标识不合法', self::VALUE_VALIDATE, 'regex', self::MODEL_BOTH),
        array('shorttitle', '', '标识已经存在', self::VALUE_VALIDATE, 'unique', self::MODEL_BOTH),
        array('title', 'require', '标题不能为空', self::VALUE_VALIDATE, 'regex', self::MODEL_BOTH),
        array('catid', 'require', '分类不能为空', self::MUST_VALIDATE , 'regex', self::MODEL_INSERT),
        array('catid', 'require', '分类不能为空', self::EXISTS_VALIDATE , 'regex', self::MODEL_UPDATE),
    );

    /* 自动完成规则 */
    protected $_auto = array(
        array('uid', 'session', self::MODEL_INSERT, 'function', 'user_auth.uid'),
        array('title', 'htmlspecialchars', self::MODEL_BOTH, 'function'),
        array('summary', 'htmlspecialchars', self::MODEL_BOTH, 'function'),
        array('viewnum', 0, self::MODEL_INSERT),
        array('update_time', NOW_TIME, self::MODEL_INSERT),
        array('status', 'getStatus', self::MODEL_BOTH, 'callback'),
    );

    /**
     * 返回前一篇文档信息
     * @param  array $info 当前文档信息
     * @return array
     */
    public function prev($info){
        $map = array(
            'id'          => array('lt', $info['id']),
            'pid'          => 0,
            'category_id' => $info['category_id'],
            'status'      => 1,
            'create_time' => array('lt', NOW_TIME),
            '_string'     => 'deadline = 0 OR deadline > ' . NOW_TIME,
        );

        /* 返回前一条数据 */
        return $this->field(true)->where($map)->order('id DESC')->find();
    }

    /**
     * 获取下一篇文档基本信息
     * @param  array    $info 当前文档信息
     * @return array
     */
    public function next($info){
        $map = array(
            'id'          => array('gt', $info['id']),
            'pid'          => 0,
            'category_id' => $info['category_id'],
            'status'      => 1,
            'create_time' => array('lt', NOW_TIME),
            '_string'     => 'deadline = 0 OR deadline > ' . NOW_TIME,
        );

        /* 返回下一条数据 */
        return $this->field(true)->where($map)->order('id')->find();
    }

    /**
     * 获取推荐位数据列表
     * @param  number  $pos      推荐位 1-列表推荐，2-频道页推荐，4-首页推荐
     * @param  number  $category 分类ID
     * @param  number  $limit    列表行数
     * @param  boolean $filed    查询字段
     * @return array             数据列表
     */
    public function position($pos, $category = null, $limit = null, $field = true){
        $map = $this->listMap($category, 1, $pos);

        /* 设置列表数量 */
        is_numeric($limit) && $this->limit($limit);

        /* 读取数据 */
        $result = $this->where($map)->select();
        return $result;
    }

    /**
     * 获取文档列表
     * @param  integer  $category 分类ID
     * @param  string   $order    排序规则
     * @param  integer  $status   状态
     * @param  string   $field    字段 true-所有字段
     * @return array              文档列表
     */
    public function lists($category, $order = '`id` DESC', $status = 0, $map = array()){
        if($category) {
            $map = $this->listMap($category, $status);
        }
        return $this->where($map)->order($order)->select();
    }

    /**
     * 计算列表总数
     * @param  number  $category 分类ID
     * @param  integer $status   状态
     * @return integer           总数
     */
    public function listCount($category, $status = 1){
        $map = $this->listMap($category, $status);
        return $this->where($map)->count('id');
    }

    /**
     * 获取详情页数据
     * @param  integer $id 文档ID
     * @return array       详细数据
     */
    public function detail($id, $page=1){
        /* 获取基础数据 */
        $info = $this->get($id);
        if($info) {
            $info = $info->data;
        }
        if ( !$info ) {
            $this->error = '文档不存在';
            return false;
        } elseif (!(is_array($info)) || 1 != $info['status']) {
            $this->error = '文档被禁用或已删除！';
            return false;
        }
        /* 获取文章内容 */
        $logic = D('ArticleContent');
        $result = $logic->where("pageorder=$page AND aid=$id")->find();
        if($result) {
            $upDriver = C('upload.driver');
            $upConfig = C('upload.'.$upDriver.'_config');
            $upurl = $upConfig['urlpre'];

            $result['content'] = str_replace('/data/attachment/portal', $upurl . '/article', $result['content']);
            $result['content'] = str_replace('/data/attachment', $upurl . '/article', $result['content']);
            $result['content'] = str_replace('/Data/Attachment/portal', $upurl . '/article', $result['content']);
            $result['content'] = str_replace('/Data/Attachment', $upurl . '/article', $result['content']);
            $detail = $result;
        } else {
            $detail = array();
        }
        return array_merge($info, $detail);
    }

    /**
     * 设置where查询条件
     * @param  number  $category 分类ID
     * @param  integer $status   状态
     * @param  number  $pos      推荐位
     * @return array             查询条件
     */
    private function listMap($category, $status = 0, $pos = null){
        /* 设置状态 */
        $map = array('status' => $status);

        /* 设置分类 */
        if(!is_null($category) &&$category){
            if(is_numeric($category)){
                $map['category_id'] = $category;
            } else if ($category) {
                $map['category_id'] = array('in', str2arr($category));
            }
        }

        /* 设置推荐位 */
        if(is_numeric($pos)){
            $map['position'] = $pos;
        }

        return $map;
    }

}
